﻿###########################################
#
#  Octojam 7 Greeting
#
#  This program is a greeting message for
#  the 2020 Octojam. Join us anytime during
#  the month of October and make a game or
#  program for CHIP-8!
#
#  Find out more at octojam.com or
#  https://itch.io/jam/octojam-7
#
###########################################

: main
	# we begin by loading a set of constants
	# into registers, which will remain there,
	# providing immediate access to all
	# of the constant coordinates at which to
	# draw the parts of our frames:
	i := init-regs
	load v9

	# draw an initial frame, and then a
	# repeating pattern of 7 frames which
	# have been pre-XORed with one another.
	# this allows us to avoid clearing the
	# screen or explicitly erasing anything,
	# to help hide the redraw:
	i := first blit
	loop
		# this loop has been unrolled for speed:
		blit blit blit blit blit blit blit
		i := frame1
	again

: blit
	# a frame is drawn in columns of two 15-tall
	# sprites, leaving mostly inconspicuous
	# margins at the top and bottom:
	:macro col {
		:alias XREG { CALLS }
		sprite XREG v7 15
		i += v9
		sprite XREG v8 15
		i += v9
	}
	# again, totally unrolled for speed:
	col col col col col col col

	# sync framerate, in case our program
	# is run on a very fast emulator:
	loop
		vf := delay
		if vf != 0 then
	again
	vf := 5
	delay := vf
;

: init-regs
	:macro xr { :byte { 5 + 8 * CALLS } }
	xr xr xr xr xr xr xr # v0 - v6 : x coodinates
	1 16                 # v7 - v8 : y coordinates
	15                   # v9      : sprite stride (bytes)

###########################################
#
#  Animation Data
#
#  These frames of animation were prerendered
#  using EZ-Bake Animator: http://beyondloom.com/tools/ezbake.html
#
#  Each frame is 7 sprites wide and two 15-row sprites tall.
#  There are 7 frames of animation, which have been pre-XORed.
#  I have manually reordered the frames from the EZ-Bake output
#  to make looping the animation slightly simpler.
#
#  The code for generating the effect follows in comments.
#  The bitmap there was, in turn, generated by
#  EZ-Pack: http://beyondloom.com/tools/ezpack.html
#
#  The outer axis is X, and sprite size is 1,
#  giving each row as a series of 8 sequential bytes.
#
###########################################

# const bitmap=[
# 	0x00,0x1F,0x00,0x3C,0x1F,0xFC,0x3E,0x00,0x00,0x3F,0x80,0x7E,0x3F,0xFC,0x7F,0x00,
# 	0x00,0x7F,0xC0,0xFF,0x3F,0xF8,0xFF,0x80,0x00,0xF3,0xC1,0xE7,0x03,0x81,0xE7,0x80,
# 	0x00,0xE1,0xE3,0xC3,0x03,0x81,0xC3,0xC0,0x01,0xC1,0xE7,0x83,0x07,0x83,0x83,0xC0,
# 	0x01,0xC1,0xE7,0x00,0x07,0x03,0x83,0xC0,0x03,0x81,0xE7,0x00,0x07,0x07,0x03,0xC0,
# 	0x03,0x81,0xCE,0x00,0x0F,0x07,0x03,0x80,0x03,0x81,0xCE,0x00,0x0E,0x07,0x03,0x80,
# 	0x03,0x83,0xCE,0x06,0x0E,0x07,0x07,0x80,0x03,0x83,0xCE,0x06,0x1E,0x07,0x07,0x80,
# 	0x03,0x87,0x8F,0x0E,0x1C,0x07,0x0F,0x00,0x03,0xFF,0x87,0xFC,0x1C,0x07,0xFF,0x00,
# 	0x01,0xFE,0x03,0xF8,0x1E,0x03,0xFC,0x00,0x00,0xFC,0x03,0xF0,0x0E,0x01,0xF8,0x00,
# 	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
# 	0x00,0xFF,0xCF,0x83,0xDF,0x00,0xFF,0xE0,0x01,0xFF,0x9F,0xC3,0xFF,0x80,0xFF,0xC0,
# 	0x00,0x1C,0x38,0xC7,0xFB,0x80,0x87,0x80,0x00,0x1C,0x30,0xC7,0x73,0x00,0x0E,0x00,
# 	0x00,0x18,0x7F,0xCE,0x63,0x00,0x0C,0x00,0x00,0x38,0x7F,0xCC,0x63,0x00,0x3E,0x00,
# 	0x06,0x38,0xE1,0x98,0x46,0x00,0x18,0x00,0x03,0xF0,0xC1,0x98,0x04,0x00,0x30,0x00,
# 	0x01,0xF0,0xC1,0x90,0x0C,0x00,0x20,0x00,0x00,0x60,0x81,0x10,0x08,0x00,0x20,0x00,
# 	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
# 	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
# ]
# function bit(x,y) {
# 	if (x<0||y<0||x>=64||y>=32) return 0
# 	x |= 0; y |= 0
# 	return (bitmap[(y*8)+(8*0|(x/8))]>>>(7-x%8))&1
# }
# for(var y=0;y<32;y++) {
# 	for(var x=0;x<64;x++) {
# 	 	const ty = y + 1.2*Math.cos(x*.30+f)
# 		const tx = x + 0.8*Math.cos(y*.20+f) + 5
# 		if (bit(tx,ty)) g.sprite(x,y,[0x80])
# 	}
# }

: first
	0x00 0x07 0x0F 0x1F 0x1E 0x38 0x78 0x70 0x38 0x38 0x38 0x38 0x38 0x3C 0x1F 0x0F
	0x03 0x00 0x0C 0x1F 0x03 0x01 0x01 0x41 0x47 0x3F 0x3E 0x0E 0x00 0x00
	0x00 0x80 0xE0 0xF0 0x78 0x7C 0x3C 0x3C 0x1E 0x1C 0x1C 0x1C 0x3C 0x38 0xF8 0xF8
	0xE0 0x40 0x00 0x84 0xF9 0xFB 0xC3 0xC7 0x0F 0x0C 0x18 0x18 0x18 0x10
	0x0F 0x1F 0x1D 0x38 0x70 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xF0 0xFE 0x7F 0x3F 0x21
	0x00 0x18 0xFC 0xEC 0x8C 0x1C 0xFC 0xF8 0x33 0x33 0x22 0x20 0x00 0x00
	0x80 0xC0 0xE7 0xE7 0x63 0x60 0x00 0x00 0x00 0x00 0x60 0x60 0xE0 0xC1 0x81 0x01
	0x01 0x00 0x20 0x3C 0x7D 0x7F 0xF7 0xC7 0x0C 0x08 0x00 0x00 0x01 0x01
	0x07 0x3F 0xFF 0xF8 0xF0 0x70 0x70 0xE0 0x70 0x70 0xE0 0xE0 0xE0 0xC0 0xC0 0xE0
	0xE0 0xC0 0x00 0x30 0xF8 0xF8 0xB0 0x30 0x60 0x40 0xC0 0x80 0x80 0x00
	0x87 0x1F 0x3F 0x3C 0x78 0x70 0xE0 0xE0 0x70 0x70 0x70 0x70 0x70 0x3F 0x1F 0x0F
	0x00 0x00 0x0F 0x0F 0x08 0x00 0x00 0x03 0x03 0x06 0x04 0x04 0x00 0x00
	0x00 0xC0 0xE0 0xE0 0xF0 0x70 0x78 0x78 0x3C 0x3C 0x38 0x78 0x78 0xF8 0xF0 0xD0
	0x80 0x00 0x00 0xE0 0xFE 0x7C 0xF8 0xC0 0xC0 0x00 0x00 0x00 0x00 0x00

: frame1
	0x00 0x07 0x08 0x18 0x11 0x37 0x66 0x6C 0x00 0x00 0x00 0x00 0x00 0x04 0x23 0x10
	0x0C 0x03 0x0C 0x03 0x3C 0x02 0x02 0x42 0x80 0x78 0x01 0x30 0x0E 0x00
	0x00 0xA0 0x10 0x0C 0x86 0x62 0x22 0x22 0x02 0x00 0x00 0x20 0x04 0x00 0x80 0x18
	0x20 0x80 0x04 0xBF 0x0E 0x3D 0x44 0x48 0x03 0x14 0x00 0x00 0x08 0x10
	0x09 0x00 0x22 0x07 0x0C 0x98 0x90 0x00 0x00 0x00 0x00 0x00 0x8E 0x41 0x00 0x2E
	0x01 0xE8 0x04 0xF4 0x94 0xE4 0x04 0xC1 0x00 0x00 0x01 0x22 0x00 0x00
	0x80 0x41 0x24 0x04 0x11 0x50 0x30 0x10 0x00 0x00 0x60 0x00 0x81 0x20 0x40 0x80
	0x01 0x00 0x20 0x5D 0x06 0x80 0x09 0x09 0x80 0x04 0x08 0x01 0x00 0x01
	0x38 0xC0 0x07 0x00 0xC8 0x48 0x00 0x90 0x00 0x90 0x00 0x00 0x20 0x00 0x20 0x00
	0x20 0xC0 0x30 0xC0 0x08 0x98 0xD0 0x50 0x20 0x80 0x40 0x00 0x80 0x00
	0x07 0x18 0x20 0x23 0x66 0x4C 0xD8 0x98 0x00 0x00 0x00 0x00 0x00 0x4F 0x20 0x10
	0x0F 0x00 0x0F 0x10 0x17 0x00 0x01 0x02 0x04 0x05 0x02 0x00 0x04 0x00
	0x00 0xC0 0x20 0x18 0x08 0x0C 0x44 0x44 0x00 0x04 0x00 0x40 0x00 0x88 0x00 0x30
	0x40 0x80 0x00 0xFC 0x06 0x8C 0x18 0x00 0x40 0xC0 0x00 0x00 0x00 0x00
	
: frame2
	0x00 0x01 0x04 0x04 0x08 0x01 0x12 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x4F 0x20
	0x30 0x1F 0x00 0x1F 0x20 0x3C 0x00 0x00 0xC4 0x80 0x79 0x00 0x32 0x0C
	0x30 0xDC 0x0C 0x02 0xE0 0x00 0x00 0x02 0x00 0x00 0x20 0x04 0x00 0x40 0xB8 0x20
	0x40 0xC1 0x3F 0xCC 0x31 0x41 0x08 0x83 0x14 0x00 0x00 0x08 0x10 0x00
	0x06 0x1D 0x38 0x20 0x43 0x04 0x08 0x10 0x00 0x00 0x00 0x10 0x00 0x4E 0x40 0x70
	0x0E 0x70 0x08 0x68 0x00 0x60 0x00 0x41 0x0A 0x00 0x10 0x21 0x02 0x00
	0x01 0x82 0x00 0x13 0x82 0x40 0x00 0x30 0x00 0x00 0x00 0x61 0x00 0x80 0x02 0x00
	0x00 0x00 0x03 0x7A 0x04 0x81 0x12 0x22 0x40 0x84 0x09 0x00 0x01 0x00
	0xC0 0x00 0x03 0xC0 0x00 0x48 0x00 0x00 0x90 0x00 0x00 0x20 0x00 0x20 0x20 0x20
	0xC0 0x20 0xC0 0x00 0x90 0x00 0x00 0x20 0x80 0x40 0x00 0x80 0x00 0x00
	0x00 0xC7 0xDC 0x18 0x01 0x22 0x04 0x40 0x08 0x00 0x00 0x00 0x00 0x00 0x4E 0x60
	0x30 0x0F 0x00 0x0F 0x00 0x1F 0x01 0x00 0x06 0x04 0x05 0x02 0x00 0x04
	0x00 0xF0 0x38 0x00 0x84 0x40 0x00 0x00 0x04 0x00 0x00 0x40 0x08 0x80 0x10 0x60
	0xC0 0x80 0x1C 0xE4 0x08 0x10 0x20 0x40 0x40 0xC0 0x00 0x00 0x00 0x00
	
: frame3
	0x01 0x02 0x00 0x04 0x09 0x02 0x10 0x00 0x04 0x48 0x48 0x48 0x48 0x4B 0x0C 0x40
	0x03 0x1C 0x03 0x1C 0x00 0x1C 0x00 0x00 0x04 0xC4 0x39 0x00 0x38 0x0C
	0xC8 0x04 0x40 0xE2 0x00 0x00 0x00 0x02 0x00 0x65 0x45 0x49 0xC9 0xB8 0x40 0x40
	0x80 0x79 0xCA 0x74 0x41 0x09 0x80 0x13 0x04 0x14 0x14 0x10 0x00 0x00
	0x00 0x02 0x04 0x18 0x20 0x42 0x04 0x88 0x10 0x20 0x20 0x20 0xB0 0x90 0x0E 0x00
	0x70 0x8E 0x70 0x80 0x68 0x80 0x60 0x80 0x40 0x2F 0x2A 0x3A 0x1B 0x01
	0x02 0xC0 0x33 0x00 0x80 0x40 0x10 0x20 0x00 0x01 0x03 0xC2 0xA2 0xA2 0x42 0x81
	0x00 0x03 0x18 0x64 0x01 0x92 0x00 0x20 0x44 0x08 0x81 0x01 0x00 0x00
	0x03 0x00 0xC4 0x03 0x40 0x08 0x00 0x80 0x10 0x20 0x20 0x40 0x40 0x20 0x00 0xC0
	0x00 0xE0 0x10 0x80 0x10 0x00 0x00 0xA0 0x40 0x40 0x00 0x00 0x00 0x00
	0x80 0x43 0x04 0xC0 0x11 0x02 0x24 0x00 0x40 0x90 0x90 0x90 0x90 0x91 0x96 0x00
	0x40 0x37 0x00 0x17 0x00 0x07 0x11 0x00 0x06 0x06 0x00 0x04 0x06 0x04
	0xF0 0x08 0x00 0x84 0x40 0x00 0x00 0x04 0x00 0x48 0xC8 0x98 0x90 0x10 0x60 0x80
	0x00 0x1C 0xE4 0x08 0x10 0x20 0x40 0x40 0xC0 0x00 0x00 0x00 0x00 0x00

: frame4
	0x02 0x00 0x04 0x09 0x12 0x14 0x24 0x2C 0x68 0x00 0x00 0x00 0x03 0x0C 0x00 0x43
	0x3C 0x03 0x1C 0x00 0x1E 0x22 0x00 0x00 0x04 0x7C 0x41 0x3A 0x04 0x00
	0x08 0x00 0x84 0x20 0x26 0x22 0x22 0x22 0x20 0x00 0x00 0x88 0x00 0x31 0x00 0x80
	0x00 0xB8 0x09 0x32 0x46 0x0D 0x8C 0x98 0x13 0x02 0x00 0x0C 0x00 0x00
	0x00 0x03 0x04 0x00 0x03 0x06 0x84 0x88 0x10 0x20 0x00 0x00 0x00 0x21 0x96 0x00
	0x01 0x76 0x80 0x70 0x8C 0xE4 0x94 0x74 0x85 0x65 0x00 0x00 0x00 0x11
	0xC0 0x30 0x01 0x80 0x10 0x50 0x20 0x00 0x01 0x00 0xC0 0x00 0x00 0x40 0x80 0x01
	0x00 0x19 0x64 0x00 0x09 0x8B 0x0A 0x08 0x08 0x00 0x80 0x00 0x00 0x00
	0x3C 0x03 0xC0 0x04 0x0B 0x88 0x80 0x10 0x10 0x20 0x00 0x40 0x00 0x40 0x00 0xC0
	0x00 0xC0 0x20 0x90 0xC8 0x58 0x50 0xD0 0xF0 0xA0 0x40 0x80 0x00 0x00
	0x03 0xC4 0x00 0x49 0x36 0x24 0x68 0x48 0x58 0x00 0x00 0x00 0x01 0x06 0x18 0x80
	0x47 0x38 0x07 0x18 0x17 0x10 0x11 0x02 0x06 0x02 0x01 0x00 0x02 0x00
	0x00 0x08 0x80 0x44 0x44 0x44 0x44 0x40 0x48 0x80 0x00 0x00 0x00 0x60 0x80 0x00
	0x00 0xEC 0x04 0x08 0x08 0x00 0x60 0x40 0x00 0x00 0x00 0x00 0x00 0x00

: frame5
	0x04 0x0C 0x18 0x12 0x04 0x20 0x08 0x40 0x00 0x00 0x00 0x00 0x0D 0x00 0x40 0x3D
	0x00 0x0D 0x00 0x1E 0x00 0x00 0x00 0x00 0x7C 0x40 0x39 0x04 0x00 0x00
	0x30 0x18 0xC8 0x44 0x00 0x04 0x00 0x00 0x00 0x45 0x00 0x80 0x08 0x00 0x71 0xE0
	0x00 0xC0 0x38 0x49 0x3D 0x42 0x00 0x04 0x88 0x01 0x02 0x00 0x0C 0x00
	0x07 0x0C 0x08 0x1B 0x24 0x48 0x88 0x10 0x00 0x20 0x00 0x00 0x01 0x2E 0x18 0x40
	0x4E 0x78 0x08 0xFC 0x00 0x70 0x80 0xF0 0x05 0xE0 0x00 0x08 0x09 0x10
	0x01 0x14 0x16 0x11 0x00 0x60 0x00 0x00 0x01 0xC0 0x02 0x00 0x40 0x80 0x02 0x00
	0x00 0x2A 0x43 0x00 0x08 0x80 0x21 0x42 0x04 0x80 0x00 0x00 0x00 0x00
	0xC0 0x3F 0x00 0xC0 0x0F 0x80 0x00 0x10 0x00 0x00 0x20 0x00 0x40 0x00 0x40 0x00
	0xE0 0x20 0xC0 0x20 0x48 0x80 0x08 0x00 0x40 0x10 0xA0 0x40 0x80 0x00
	0x04 0xC8 0x5B 0xB6 0x00 0x48 0x00 0x10 0x80 0x00 0x00 0x01 0x06 0x18 0x00 0xE7
	0x38 0x07 0x08 0x17 0x00 0x08 0x03 0x02 0x02 0x01 0x00 0x02 0x00 0x00
	0x30 0x10 0x88 0x48 0x08 0x00 0x00 0x00 0x08 0x00 0x00 0x10 0x00 0x60 0x00 0x00
	0x00 0x70 0x0C 0x86 0x14 0x28 0x20 0x60 0x00 0x00 0x00 0x00 0x00 0x00
	
: frame6
	0x05 0x08 0x10 0x03 0x24 0x00 0x48 0x00 0x00 0x00 0x48 0x48 0x46 0x61 0x20 0x0E
	0x01 0x0E 0x11 0x1E 0x00 0x00 0x02 0x60 0x5C 0x00 0x19 0x0C 0x00 0x00
	0xC0 0x20 0x10 0x88 0x40 0x00 0x00 0x00 0x00 0x01 0x65 0x65 0xC5 0x8D 0x09 0x18
	0xE0 0x00 0xC0 0x38 0x01 0x3A 0x40 0x00 0x00 0x03 0x12 0x14 0x14 0x10
	0x08 0x00 0x13 0x24 0x48 0x00 0x90 0x00 0x20 0x00 0x20 0x20 0x3E 0x10 0xC0 0x0F
	0x30 0x08 0x74 0x80 0x70 0x00 0xF0 0x85 0x60 0xAB 0x2B 0x31 0x10 0x00
	0x42 0x25 0x00 0x86 0x01 0x60 0x00 0x00 0x00 0xC1 0xA1 0xA3 0x63 0xC2 0x82 0x00
	0x01 0x30 0x0C 0x43 0x00 0x98 0x20 0x41 0x02 0x08 0x00 0x00 0x01 0x01
	0x03 0xDC 0x00 0x03 0x8C 0x00 0x80 0x10 0x00 0x00 0x00 0x20 0x20 0x60 0x40 0x00
	0x00 0xC0 0x00 0xD0 0x08 0x40 0x88 0x00 0x00 0x10 0xA0 0x40 0x00 0x00
	0x88 0x10 0xA3 0x04 0x48 0x00 0x10 0x80 0x00 0x00 0x90 0x91 0x9F 0xC0 0xE0 0x1F
	0x00 0x0F 0x00 0x07 0x08 0x00 0x03 0x02 0x02 0x04 0x06 0x04 0x00 0x00
	0x40 0x20 0x10 0x80 0x00 0x08 0x00 0x00 0x00 0x88 0xC8 0x88 0x18 0x18 0xF0 0xC0
	0x00 0x80 0x70 0x8E 0x82 0x14 0x28 0x20 0xE0 0x00 0x00 0x00 0x00 0x00
	
: frame0
	0x02 0x00 0x00 0x00 0x22 0x00 0x00 0x00 0x48 0x48 0x00 0x00 0x00 0x22 0x00 0x00
	0x02 0x00 0x02 0x00 0x02 0x00 0x00 0x22 0x64 0x00 0x20 0x02 0x00 0x00
	0x00 0x40 0x00 0x00 0x00 0x44 0x00 0x00 0x22 0x21 0x00 0x00 0x00 0x44 0x00 0x00
	0x00 0x40 0x00 0x44 0x04 0x00 0x00 0x44 0x88 0x00 0x04 0x00 0x00 0x00
	0x00 0x10 0x01 0x00 0x00 0x90 0x00 0x00 0x20 0x20 0x00 0x10 0x01 0x80 0x00 0x11
	0x00 0x10 0x80 0x10 0x00 0x90 0x80 0x01 0xAA 0x01 0x10 0x00 0x00 0x00
	0x00 0x02 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x10 0x00 0x02 0x00 0x10 0x00 0x8A 0x00 0x00 0x00 0x00 0x00
	0x04 0x20 0x00 0x04 0x00 0x00 0x00 0x00 0x90 0x90 0x00 0x00 0x00 0x20 0x00 0x20
	0x00 0x20 0x00 0x20 0x00 0x00 0x00 0x00 0x50 0x20 0x00 0x00 0x00 0x00
	0x08 0x80 0x00 0x00 0x08 0x00 0x80 0x00 0x90 0x90 0x00 0x00 0x08 0x00 0x00 0x08
	0x00 0x08 0x00 0x00 0x08 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00
	0x80 0x00 0x00 0x10 0x80 0x00 0x00 0x00 0x44 0x44 0x00 0x00 0x80 0x00 0x00 0x10
	0x80 0x00 0x80 0x10 0x80 0x80 0x10 0x00 0x20 0x00 0x00 0x00 0x00 0x00
